package com.atguigu.gmall.product.service.impl;

import com.atguigu.gmall.model.product.BaseAttrInfo;
import com.atguigu.gmall.model.product.BaseAttrValue;
import com.atguigu.gmall.product.service.BaseAttrValueService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.product.service.BaseAttrInfoService;
import com.atguigu.gmall.product.mapper.BaseAttrInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @author lfy
 * @description 针对表【base_attr_info(属性表)】的数据库操作Service实现
 * @createDate 2022-03-04 09:33:25
 */
@Service
public class BaseAttrInfoServiceImpl extends ServiceImpl<BaseAttrInfoMapper, BaseAttrInfo>
        implements BaseAttrInfoService {


    @Resource
    BaseAttrInfoMapper baseAttrInfoMapper;

    // @Autowired(required = false) 需要注入的组件可以没有
    @Autowired
    BaseAttrValueService baseAttrValueService;

    @Override
    public List<BaseAttrInfo> getAttrInfoAndValueList(Long category1Id, Long category2Id, Long category3Id) {


        return baseAttrInfoMapper.getAttrInfoAndValueList(category1Id, category2Id, category3Id);
    }

    @Override
    public void saveAttrInfo(BaseAttrInfo info) {


        if(info.getId() == null){
            //前端没有带属性id，就是新增
            addAttrInfo(info);
        }else {
            updateAttrInfo(info);
        }

    }

    /**
     * 属性修改
     * @param info
     */
    private void updateAttrInfo(BaseAttrInfo info){
        Long id = info.getId();
        //1、修改属性信息
        baseAttrInfoMapper.updateById(info);


        //2、拿到所有需要改变的属性值
        List<BaseAttrValue> list = info.getAttrValueList();


        List<Long> modifyIds = new ArrayList<>();
        //2、删除前端没提交的id，就是需要删除的值  modifyIds(这是不删除的)
        for (BaseAttrValue attrValue : list){
            if(attrValue.getId() !=  null){
                modifyIds.add(attrValue.getId() );
            }
        }


        //3、如果前端没有带任何有id的value值，说明这个属性下的之前所有值都要删除
        if((list == null || list.size() == 0) || modifyIds.size() == 0){
            //全删操作
            QueryWrapper<BaseAttrValue> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("attr_id",id);
            baseAttrValueService.remove(queryWrapper);
        }




        //4、如果前端带了任何有id的value值，说明这些value是需要修改的
        if(modifyIds.size() > 0){
            QueryWrapper<BaseAttrValue> wrapper = new QueryWrapper<>();
            wrapper.notIn("id",modifyIds); //不在前端带的id范围内的都需要删除
            wrapper.eq("attr_id",id);//爆炸bug。。。。
            baseAttrValueService.remove(wrapper);
        }


        //4、修改
        for (BaseAttrValue attrValue : list) {
            //1）、属性值若带了id，需要修改
            if(attrValue.getId() !=  null){
                //更新
                baseAttrValueService.updateById(attrValue);

            }else {
                //2）、如果没带id。新增这个属性的一些值
                attrValue.setAttrId(id); //回填attrid
                baseAttrValueService.save(attrValue);
            }
        }



    }


    /**
     * 属性新增
     * @param info
     */
    private void addAttrInfo(BaseAttrInfo info){
        //1、保存属性名相关数据
        baseAttrInfoMapper.insert(info);

        //获取到刚才保存的记录的自增id
        Long id = info.getId();

        //2、保存值
        List<BaseAttrValue> attrValueList = info.getAttrValueList();
        if (attrValueList!=null && !attrValueList.isEmpty()) {
            for (BaseAttrValue value : attrValueList) {
                value.setAttrId(id);
            }
        }
        //3、批量保存值
        baseAttrValueService.saveBatch(attrValueList);
    }
}




